package n16_共享模型内存_有序性和可见性;

import lombok.extern.slf4j.Slf4j;
import utils.Sleeper;

/**
 * @author fu
 * @date 2022-01-13 20:41
 * 概要：
 * ---------------------------------------------------------------
 * 1. 一个线程 对 主存 的 数据 进行修改
 * 2. 但是 对 另一个线程 不可见
 *
 * volatile 关键字
 * 1. 用来修饰成员变量 和 静态成员变量
 * 2. 避免线程 从自己的 工作缓存中 查找变量的值，必须到 主内存获取值
 * 3. 线程操作 volatile 变量都是直接操作 主内存
 * |=============================================================
 */
@Slf4j(topic = "c.T1")
public class T1_退不出的循环_by_volatile {

// HEAD >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    static boolean run = true;

// =======================================================
    // 加入 易变 修饰字符：volatile 解决
//    volatile static boolean run = true;

// END  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    public static void main(String[] args) throws InterruptedException {

        Thread t = new Thread(()->{
            while(run){
                // ....
            }
        });
        t.start();
        Sleeper.sleep(1);
        log.debug("一秒后 改为 false， 但是 t线程的循环 不会停止！");
        run = false; // 线程t不会如预想的停下来

    }
}
